#ifndef __UNTIL__HPP__
#define __UNTIL__HPP__

#include <iostream>
#include <string>
#include <ctime>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

namespace Logs
{
    namespace Until
    {
        class Time
        {
        public:
            // 获取时间
            // 静态函数在类域外(不创建类)也可以调用
            static time_t GetTime()
            {
                return time(nullptr);
            }
        };
        class File
        {
        public:
            // 利用access对象查看目录是否存在。
            // 存在就不用创建了，不存在则创建
            static bool exists(const std::string& pathname)
            {
                // #include <sys/types.h>
                // #include <sys/stat.h>
                // #include <unistd.h>

                // // 使用stat
                // struct stat st;
                // if(stat(pathname.c_str(),&st) == 0)
                // {
                //     return true;
                // }

                    return false;
                if(access(pathname.c_str(),F_OK) == 0)
                {
                    return true;
                }

                return false;
            }
            // 文件路径
            static std::string path(const std::string& pathname)
            {
                // 从最后开始找字符串中的某一个。
                // '\\'就是\字符，因为\常常用作转义字符，与其他字符构成和格式化字符。
                // 所以用'\\'表示\。
                size_t pos = pathname.find_last_of("/\\");
                if(pos == std::string::npos)
                {
                    return std::string();
                }
                return pathname.substr(0,pos + 1);
            }
            static void createdirectory(const std::string& pathname)
            {
                size_t pos = 0, start = 0;

                // ./abc/def/ghi.txt
                while(start < pathname.size())
                {
                    pos = pathname.find_first_of("/\\",start);
                    // 有可能只是一个单一的目录。不存在"/\\"。
                    if(pos == std::string::npos)
                    {
                        mkdir(pathname.c_str(),0777);
                    }
                    // 查看目录是否创建好了。
                    // 如果目录没有建好的话，则建好上一级目录。
                    // 就一个一个用地址建，不移动目录。
                    std::string parent_dir = pathname.substr(0,pos);
                    if(exists(parent_dir) == true)
                    {
                        start = pos + 1;
                        continue;
                    }
                    mkdir(parent_dir.c_str(),0777);
                    start = pos + 1;
                }
            }
        };
    }
}

#endif